// 引入离线库（注意路径根据实际位置调整）
// 使用IIFE方式加载JSEncrypt，避免依赖全局对象
import './jsencrypt.min.js';

// 获取JSEncrypt构造函数（兼容H5和小程序）
let JSEncrypt = typeof window !== 'undefined' ? window.JSEncrypt : global.JSEncrypt;
try {
  // 尝试直接导入JSEncrypt
  console.log('Attempting to load JSEncrypt...');
  
  // 方案3: 如果前两种方法都失败，尝试使用require（如果环境支持）
  if (!JSEncrypt && typeof require === 'function') {
    try {
      console.log('Trying to require JSEncrypt...');
      // 注意：这里的路径需要根据实际情况调整
      const jsencryptModule = require('./jsencrypt.min.js');
      JSEncrypt = jsencryptModule.default || jsencryptModule.JSEncrypt || jsencryptModule;
      console.log('JSEncrypt from require:', typeof JSEncrypt);
    } catch (e) {
      console.log('Require failed:', e.message);
    }
  }
  
  console.log('JSEncrypt final initialization result:', typeof JSEncrypt);
} catch (e) {
  console.error('Error in JSEncrypt initialization process:', e);
}

// 模拟crypto对象，解决微信小程序环境下crypto未定义的问题
// try {
//   // 优先检查小程序环境
//   if (typeof wx !== 'undefined') {
//     // 微信小程序环境
//     if (!global) {
//       global = {};
//     }
//     if (!global.crypto) {
//       global.crypto = {
//         getRandomValues: function(array) {
//           for (let i = 0; i < array.length; i++) {
//             array[i] = Math.floor(Math.random() * 256);
//           }
//           return array;
//         }
//       };
//     }
//   } else if (typeof window !== 'undefined' && !window.crypto) {
//     window.crypto = {
//       getRandomValues: function(array) {
//         for (let i = 0; i < array.length; i++) {
//           array[i] = Math.floor(Math.random() * 256);
//         }
//         return array;
//       }
//     };
//   } else if (typeof global !== 'undefined' && !global.crypto) {
//     global.crypto = {
//       getRandomValues: function(array) {
//         for (let i = 0; i < array.length; i++) {
//           array[i] = Math.floor(Math.random() * 256);
//         }
//         return array;
//       }
//     };
//   }
// } catch (e) {
//   console.error('Error creating crypto polyfill:', e);
// }


/**
 * RSA加密
 * @param {string} publicKey - 公钥字符串
 * @param {string} data - 需要加密的数据
 * @returns {string} 加密后的数据（Base64格式）
 */
export function rsaEncrypt(publicKey, data) {
	console.log("rsaEncrypt 111")
	if (!publicKey || !data) {
      console.log('Invalid parameters');
      return '参数无效 失败';
    }
    
    if (!JSEncrypt || typeof JSEncrypt !== 'function') {
      console.error('JSEncrypt is not available or not a constructor');
      return 'JSEncrypt未加载 失败';
    }
	console.log("rsaEncrypt 222")
	 try {
      const encryptor = new JSEncrypt();
      // 设置公钥（需包含BEGIN和END标签，否则可能失败）
      encryptor.setPublicKey(publicKey);
      // 加密（注意：RSA加密有长度限制，过长数据需分段加密）
      const result = encryptor.encrypt(data);
      console.log('Encryption result:', !!result);
      return result || '加密为空 失败';
    } catch (e) {
      console.error('Encryption error:', e);
      return '加密过程异常 失败: ' + e.message;
    }
}


/**
 * 格式化公钥（自动添加换行和标签，避免格式错误）
 * @param {string} key - 原始公钥字符串（可能不含标签或换行）
 * @returns {string} 格式化后的公钥
 */
export function formatPublicKey(key) {
	if (!key) return '';
	// 去除所有空格和换行
	key = key.replace(/\s/g, '');
	// 添加标签和换行（每64字符换行，符合PEM格式）
	return `-----BEGIN PUBLIC KEY-----\n${key.match(/.{1,64}/g).join('\n')}\n-----END PUBLIC KEY-----`;
}